package com.lancoo.ccas52.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lancoo.ccas52.entity.CollegeStatus;
import com.lancoo.ccas52.entity.Schedule;
import com.lancoo.ccas52.entity.ScheduleConflictInfo;
import com.lancoo.ccas52.pojo.common.PageInfo;
import com.lancoo.ccas52.pojo.dto.*;
import com.lancoo.ccas52.pojo.vo.*;

import java.util.List;

/**
 * <p>
 * 课表 服务类
 * </p>
 *
 * @author quin.song
 * @since 2023-03-27
 */
public interface ScheduleService extends IService<Schedule> {

    /**
     * 获取教学班数据.未锁定教学班。 教务管理员学院传null,专业性质传1. 院系管理员学院传学院id，专业性质传2
     *
     * @param taskId
     * @param campusId  校区id 传null获取全部
     * @param collegeId 学院id 传null获取全部
     * @param majorProp 专业性质，1:公共课，2:专业课
     * @return
     */
    List<ArrangeTeachingClassDto> getTeachingClassDate(Integer taskId, String campusId, String collegeId, Integer majorProp);

    /**
     * 获取教室数据
     *
     * @param schoolId
     * @param term
     * @param campusId null全部
     * @return
     */
    List<ArrangeRoomDto> getArrangeRoom(String schoolId, String term, String campusId);

    /**
     * 获取学时学时信息 （过滤掉时间禁排的学时）
     *
     * @param schoolId
     * @param term
     * @param collegeId
     * @return
     */
    List<ArrangePeriod> getArrangeTimeCode(String schoolId, String term, String collegeId);

    /**
     * 场地禁排的信息
     *
     * @param schoolId
     * @param term
     * @param campusId
     * @return
     */
    List<ArrangeRoomRuleDto> getArrangeRoomProhibit(String schoolId, String term, String campusId, String collegeId);

    /**
     * 获取课程禁排部分字段 教学班禁排
     *
     * @param taskId
     * @return
     */
    List<ArrangeCourseRuleDto> getArrangeCourseProhibit(Integer taskId);

    /**
     * 获取教师禁排部分字段
     *
     * @param schoolId
     * @param term
     * @return
     */
    List<ArrangeTeacherRuleDto> getArrangeTeacherTime(String schoolId, String term, String collegeId);

    /**
     * 获取本任务已经锁定的课表。以及本学期其他任务课表  包含教学班的教室id、学时信息
     *
     * @param taskId
     * @param campusId
     * @param isLocked  1未锁定  2锁定 null全部
     * @param majorProp 课程类型 用于区分排课类型 传null表示仅教务管理员排课，获取锁定课表
     * @param collegeId null全部 空字符串公共课 其他表示该院系专业课
     * @return
     */
    List<ArrangeScheduleDto> getLockSchedule(Integer taskId, String campusId, Integer isLocked, Integer majorProp, String collegeId);


    /**
     * 存储每轮排课的课程信息，即课表信息
     *
     * @param schedules
     * @param collegeId 指定学院 传null删除全部
     * @param majorProp 课程类型 用于区分排课类型 传null表示仅教务管理员排课，删除课表全部数据
     */
    void addBathSchedule(Integer taskId, List<Schedule> schedules, String collegeId,Integer majorProp);

    /**
     * 存储每轮排课的冲突信息
     *
     * @param scheduleConflicts
     */
    void addBatchScheduleConflict(Integer taskId, List<ScheduleConflictInfo> scheduleConflicts, List<Long> roomIds);

    /**
     * 更新教学班排课状态
     *
     * @param arrangeTeachingClassUpdates
     */
    void updateScheduleState(List<ArrangeTeachingClassUpdate> arrangeTeachingClassUpdates);


    /**
     * 根据教学班id获取 该教学班冲突
     *
     * @param teachingClassId
     * @return
     */
    List<ScheduleConflictInfo> getScheduleConflictInfo(Long teachingClassId);


    /**
     * 获取课表编排 课程教学班信息
     *
     * @param taskId
     * @param page
     * @param state       1正常  2冲突
     * @param isLocked    1未锁定  2锁定
     * @param collegeId
     * @param studyNature
     * @return
     */
    PageInfo<TeachingClassCourseDto> getTeachingClassCoursePage(Integer taskId, Page page, Integer state, Integer isLocked, String collegeId, Integer studyNature, Integer majorProp);

    /**
     * 根据教学班获取周次 课表信息
     *
     * @param teachingClassId
     * @return
     */
    TeachingClassCourseDto getWeekSchedule(Long teachingClassId);

    /**
     * 获取课表编排 环节教学班信息
     *
     * @param taskId
     * @param page
     * @param state       1正常  2冲突
     * @param collegeId
     * @param studyNature
     * @return
     */
    PageInfo<TeachingClassSegmentDto> getTeachingClassSegmentPage(Integer taskId, Page page, Integer state, String collegeId, Integer studyNature);

    /**
     * 获取锁定的课程教学班数量
     *
     * @param taskId
     * @return
     */
    Long getAllLockedTeachingClass(Integer taskId, String collegeId, Integer majorProp);

    /**
     * 修改教学班锁定状态
     *
     * @param isLocked         1解锁  2锁定
     * @param teachingClassIds
     * @return
     */
    boolean updateLock(Integer isLocked, List<Long> teachingClassIds);

    /**
     * 锁定所有正常教学班
     *
     * @param taskId
     */
    Boolean allNormalLocal(Integer taskId, String collegeId, Integer majorProp);

    /**
     * 解锁所有教学班
     *
     * @param taskId
     * @return
     */
    Boolean allUnLock(Integer taskId, String collegeId, Integer majorProp);

    /**
     * 提交编排课表
     * @param collegeStatus
     * @return
     */
    CollegeStatus arrangeSubmit(CollegeStatus collegeStatus);

    void removeArrangeSubmit(CollegeStatus collegeStatus);

    /**
     * 获取课表编排统计信息
     *
     * @param taskId
     * @return
     */
    PublishStatisticsArrange getPublishStatisticsArrange(Integer taskId, String collegeId, Integer majorProp);


    /**
     * 自动排课 返回冲突
     *
     * @param taskId
     * @return
     */
    List<ScheduleConflictInfo> autoArrangement(Integer taskId, String collegeId, Integer majorProp);

    /**
     * 获取单个教学班详情
     *
     * @param teachingClassId
     * @return
     */
    TeachingClassCourseDto getTeachingClassById(Long teachingClassId);

    /**
     * 初始化全部课表
     *
     * @param taskId
     * @return
     */
    List<Schedule> generateTeachingClassUnit(Integer taskId, Long teachingClassId);


    /**
     * 根据教学班id删除课表
     *
     * @param teachingClassId
     * @return
     */
    Boolean removeSchedule(Long teachingClassId);

    /**
     * 获取调整场地节次 列表
     *
     * @param taskId
     * @param weeks
     * @param timeCodes
     * @param roomId
     * @param teachingClass
     * @return
     */
    PageInfo<VenueSessionVo> getVenueSession(Integer currentPage, Integer pageSize, Integer taskId, String weeks, String timeCodes, Long roomId, String collegeId, ArrangeTeachingClassDto teachingClass);

    /**
     * 查看空闲教室 课表
     *
     * @param taskId
     * @param weeks
     * @param sections
     * @param connectSection
     * @param buildingId
     * @param roomType
     * @return
     */
    PageInfo<VenueSessionVo> getFreeVenueSession(Integer currentPage, Integer pageSize, Integer taskId, String weeks, String sections, Integer connectSection, Integer buildingId, Integer roomType, String week, Long roomId, String collegeId);

    /**
     * 调整周次
     *
     * @param updateSchedule
     * @param addSchedule
     * @param teachingClassId
     * @return
     */
    List<ScheduleDto> updateVenueSession(List<Schedule> updateSchedule, List<Schedule> addSchedule, Long teachingClassId);

    /**
     * 确定排课结果列表
     *
     * @param taskId
     * @param collegeId
     * @param keyWord
     * @return
     */
    List<DetermineStatistics> arrangeDetermineStatistics(Integer taskId, String collegeId, String keyWord, Integer arrangeSubmit);

    /**
     * 获取未排节次
     *
     * @param taskId
     * @return
     */
    List<ScheduleUnitGroupVo> getUnArrangeSchedule(Integer taskId);

    /**
     * 获取课程教学班编排课表
     *
     * @param taskId
     * @param state
     * @param collegeId
     * @param collegeName
     * @param studyNature
     * @return
     */
    String courseToExcel(Integer taskId, Integer state, String collegeId, String collegeName, Integer studyNature, Integer majorProp);

    /**
     * 获取环节教学班编排课表
     *
     * @param taskId
     * @param state
     * @param collegeId
     * @param collegeName
     * @param studyNature
     * @return
     */
    String segmentToExcel(Integer taskId, Integer state, String collegeId, String collegeName, Integer studyNature);


}
